Nginx Configuration

2017 11 17일 금요일

오전 10:40

링크: https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx

 

개요

Nginx 는 가벼우면서도 고성능인 웹서버이다. (웹서버 양대산맥은 Nginx vs Apache)

많은 양의 Static contents를 빠르게 제공하고, 시스템 리소스를 효율적으로 사용한다

 

request 가 밀려들어오면

1) Apache 웹서버는 동기식으로 쓰레드나 프로세스들을 늘려서 대응한다.

2) Nginx 웹서버는  비동기식으로 event-driven 형태로 대응한다. request 로드에 대한 퍼포먼스 예측이 용이하다

 

Nginx Static 전문이다

 

Dynamic contents 에 대해서는

1) embedded interpreter 를 사용하지 않는다. (내부적으로 바로바로 처리하지 않는다는 것)

2) CGI, FASTCGI 로 넘겨버리거나, 심지어, Apache 와 같은 다른 웹서버로 넘겨버리기도 한다

-  처리가 되고나면 결과를 Nginx 웹서버로 회신주고, Nginx는 클라이언트 (=브라우저)로 전달

 

Nginx configuration file

- 모두 /etc/nginx 폴더에 있다.

- 대표적 configuration file/etc/nginx/nginx.conf 이다.

*  혹시나 없으면 /opt/nginx/conf/ 폴더를 볼것

total 
72 
rwxr -xr - 
rwxr -xr - 
rwxr -xr - 
rwxr -xr - 
-rw-r- 
-rw-r- 
-rw-r- 
rwxr -xr - 
rwxr -xr - 
rwxr -xr - 
-rw-r- 
-rw-r- 
Is 
-al /etc/nginx 
: 46 
23: 57 
: 44 
e5 : 44 
: 46 
rwxr -xr - 
: 46 
: 46 
: 46 
x 
x 
x 
x 
x 
x 
x 
x 
8 
2 
I 
I 
I 
I 
I 
2 
2 
I 
I 
I 
2 
2 
2 
I 
I 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
root 
4096 
4096 
406 
1 ø77 
1 øe7 
2837 
2223 
3957 
406 
4096 
15ø5 
636 
4096 
4096 
4096 
664 
3ø71 
Nov 
Nov 
Jul 
Jul 
Jul 
Jul 
Jul 
Jul 
Jul 
Nov 
Jul 
Jul 
Jul 
Nov 
Nov 
Nov 
Jul 
Jul 
16 
16 
12 
12 
12 
12 
12 
12 
12 
16 
12 
12 
12 
16 
16 
16 
12 
12 
05 : 
05 : 
05 : 
05 : 
05 : 
05 : 
05 : 
05 : 
05 : 
05 : 
44 
44 
44 
44 
44 
44 
44 
44 
44 
44 
conf. d 
fastcgi . conf 
fastcgi_parans 
koi -utf 
koi -win 
mime. types 
modules -avai lable 
modules - enabled 
nglnx. con 
proxy_params 
scgl_params 
sites-available 
sites-enabled 
snippets 
uwsgl_params 
win -utf

 

본격적으로 Configuration 둘러보기

 

일단 백업

- 잘못 만지면 안되니 원래 conf 파일은 백업해두자.

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

- 좋은 습관은 날짜정보를 담아서 백업하는 거다. 스크립트로 만들어둬도 될듯

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date "+%b_%d_%Y_%H.%M.%S")

 

리로드

- /etc/nginx/nginx.conf 파일을 변경한 후 적용하려면 reload 해줘야 한다

service nginx reload

* 안되면 sudo를 먹여주자. sudo service nginx reload

 

하나씩 들여다보자

/etc/nginx/nginx.conf 파일

- 처음에는 웹서버의 core 가 되는 기본동작 설정

- 그다음엔 HTTP 블록, server 블록

- 마지막으로 virtual host 설정 파일들

 

1. Core 부분

 

- 웹서버의 기본 동작 정의 부분

user www-data; 
worker_processes 4; 
pid /run/nginx.pid; 
events { 
worker connections 768; 
# multi _ accept on; 
8

 

user www-data; 
worker_processes auto; 
pid /run/nginx.pid; 
include /etc/nginx/rodules-enabled/*. conf; 
events { 
worker connections 768; 
# multi accept on;

 

* 위는 예시, 아래는 진짜 내가 깔아놓은 Nginx 정보

 

user

- 리눅스 시스템의 누가 nginx server의 주인으로서 구동시키는가?

- debian 기반 리눅스에선 www-data 라고 생각하면 된다.

 

worker_processes

- Nginx가 구동할 쓰레드 개수, 또는 동시 인스턴스 개수

- 나중에 좀 더 자세히 보자.

http://nginx.org/en/docs/ngx_core_module.html#worker_processes

 

pid

- Nginx master process PID

- (Linux) OS가 추적하고 signal을 보내기 위해 쓰인다.

-  cat /nginx.pid 해보니 값이 나온다.

 

 

2. HTTP (Universal Configuration)

 

- HTTP web traffic 을 어떻게 핸들링할지 설정하는 부분

http { 
# Basic Settings 
sendfile on; 
tcp_nopush on; 
tcp_nodelay 
keepalive_timeout 
types hash max_size 
2848; 
# server_tokens off; 
# server names hash bucket size 64; 
# server_name_in_redirect off; 
include /etc/nginx/mime. types; 
default_type application/octet-stream; 
# Logging Settings 
access_log /var/log/nginx/access.log; 
error log /var/log/nginx/error. log; 
# Gzip Settings 
gzlp 
gzip_disable 
"msie6" ;

 

http { 
# Basic Settings 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
keepal ive_timeout 65 ; 
types_hash max_size 2048; 
# server tokens off; 
# server nars hash bucket size 64; 
# server nar in redirect off; 
include /etc/nginx/mime . types; 
default_type application/octet-strean; 
# SSL Settings 
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
on; 
# Logging Settings 
# Dropp 
access_log /var/log/nginx/access . log; 
error_log /var/log/nginx/error . log; 
# Gzip Settings 
gz1p on; 
gzip_disable "msie6" ; 
# gzip_vary on; 
# gzip_proxied any; 
# gzip_buffers 16 8k; 
# gzip_http_version 1.1; 
# gzip_types text/plain text/css application 
*rss text/ javascript; 
# Virtual Host Configs 
include /etc/nginx/conf . d/ * . conf; 
include /etc/nginx/sites-enabled/*•

 

 

* 왼쪽이 예제, 오른쪽이 실제 캡처

 

- 보통은 as-is, 즉 현재 상태를 정리해 놓은 거다.

 

include

- c 파일의 include 를 떠올리면 된다.

- /etc/nginx/mime.types 문서안의 내용이 붙여넣어진다는 것

- /etc/nginx/nginx.conf 파일의 http {} 안에 다 때려넣으면 정신없잖아?

 

* 특정 폴더안의 전체 내용을 가져올 수도 있다.

include /etc/nginx/sites-enabled/*;

* 아니면 특정 확장자도 가능

include /etc/nginx/conf.d/*.conf;

 

gzip

- on-the-fly (= 대충, 후다닥) 압축을 사용하여

- 밴드위쓰 제한하고 전송속도를 빠르게 한다.

- Apache 웹서버의 mode-deflate 와 같다.

- gzip 더보기: http://nginx.org/en/docs/http/ngx_http_gzip_module.html

 

* HTTP 블록 더보기

- http://nginx.org/en/docs/http/ngx_http_core_module.html

 

3. Server (Virtual Domains Configuration)

 

위에 언급하진 않았지만

HTTP 블록에는 include /etc/nginx/sites-enabled/*; 이 있다.

- 이렇게 해두면 server 블록에서는

- site-enabled 서브 디렉토리에서 분리된 파일들을 찾을 수 있다.

 

* 보통 site-enabled 의 파일들은 실제 /etc/nginx/sites-available/ 폴더내 파일의 symlink 이다.

** symlink 를 통해 원본 파일 (= /etc/nginx/sites-available/ )은 보존한 상태에서 virtual sever enable / disable 가능하다.

- 심볼릭링크는 다양한 위치의 원본파일을 한군데 모으기 위해 사용하기도 한다.

- 사용법: http://idolpia.blog.me/221108193365

 

/etc/nginx/sites-available/ 에는 default 라는 파일이 있으며, 이 파일은 일종의 template 파일이다.

이걸 복사해서, 내가 원하는 방법대로 사용하면 된다

(중요) 결국 http 블록의  include /etc/nginx/sites-enabled/*; 는 예를 들어

- 실제로는 sites-available 폴더에 있는 100개의 사이트 정보 파일들 중에서

- 쓰기를 원하는 사이트 정보 파일들만을 simlink 하는 것이다. simlink를 나중에 삭제해도 원본은 sites-available에 남아있게 된다

default를 비롯한 내부의 파일들에 정의된 server 블록들을 가져오는 것이다.

 

* default 의 주석처리 안된 부분 참고

server { 
listen 8ø default 
listen [ : 
: ] :8ø default_server; 
SSL configuration 
listen SSI default _ server; 
Note: You should disable gzip for SSL traffic. 
See: https://bugs.debisn.org/7733S2 
Read up on ssl_ciphers to ensure a secure configuration. 
https://bugs.debian.org/765782 
Self signed certs generated by the ssl-cert package 
Don't use them in a production 
include snippets/snakeoil. conf; 
root / var/www/html; 
# Add index.php to the list if you are using PHP 
index index.html index. htm index.nginx-debian .html; 
server 
location / { 
# First attempt to serve request as file, then 
# directory, then fall back to displaying 4Z4. 
try_files *uri $uri/ =4ø4;

 

 

원문링크의 내용을 보고 server 블록을 이해해보자

server 블록은 사용자가 디폴트 설정에서 가장 많이 수정하는 부분이다.

server 
listen 88 default server; 
listen C default _ server ipv60n1y=on; 
root /usr/share/nginx/html; 
index index. html index. htm; 
# Make site accessible from http://LocaLhost/ 
server name localhost; 
location 
# First attempt to serve request as file, then 
# as directory, then fat L back to displaying a 404. 
try _ files 
Suri $uri/ / index.html; 
# Uncomment to enable naxsi on this Location 
# include /etc/nginx/naxsi.rutes 
18

 

우선 server 블록의 listen 을 보자

 

- nginx 서버에게, 듣고 있어야 할  IP port 를 알려준다.

- 여러 예제를 보자

 

listen 
listen 
default server; 
88 
[ • : ) default_server ipv60n1y=on;

1) default_sever

- 80 포트로 들어온 request

- 다른 virtual host request 에 응답하지 않으면

- server { } 가 처리할 것임

2) 두번째 줄도 같은 의미임

- 다만 IPv6 대응을 의미

listen 
listen 
127.ø.ø.1:8€; 
local host: 88;

1) local loopback interface 127.0.0.1:80을 듣겠다는 것

2) localhost 127.0.0.1 을 의미하는데

- 이것은 /etc/hosts 파일에 정의되어 있다.

127 .ø.ø.l 
cat /etc/hosts 
localhost 
localhost ip6-IocaIhost ip6-Ioopback 
ip6-aIInodes 
ip6-aIIrouters

listen 
listen 
127.ø.ø.1:8€8a,• 
local host: 888a;

이번에도 localhost listen 하지만

이번에는 8080포트를 listen

listen 
listen 
192.168.3.105: se; 
192.168.3.105: sege;

특정 IP address 의 특정 port listen 하겠다는 것

listen 
listen 
listen 
listen 
8888; 
: 888e;

1) 80 또는 *:80은 모든 IP 80 포트 listen 하겠다는 것

2) 8080 또는 *:8080은 모든 IP 8080 포트 listen 하겠다는 것

 

listen 
listen 
listen 
12.34.56.77:88 
12.34.56.78:88 
12.34.56.79:88

특정 IP 80 포트를 listen 하겠다는 것

 

다음엔 server 블록의 server_name 을 보자

 

-  여러 예시

example.com 으로의 request nginx 가 처리하라

example.com 또는 www.example.com 둘 다 nginx 가 처리하라

setwer name 
server name 
*.example.com; 
. example.com;

*.example.com .example.com 은 같은 의미이며

- 모든 서브도메인을 nginx 가 처리하라는 것

- 예를 들면 foo.example.com

이번에는 example 로 시작하는 모든 도메인

- 예를 들면 example.net / example.com / example.org 등등

다른 여러 도메인 이름도 처리

valid host name 이 아니더라도 /etc/hosts 파일에 정의되면 쓸 수 있다.

127 .ø.ø.l 
cat /etc/hosts 
localhost 
localhost ip6-IocaIhost ip6-Ioopback 
ip6-aIInodes 
ip6-aIIrouters

모든 request 다 처리하자

 

4. 기타등등

 

1) Access Logs

- http 블록이건, server 블록이건 어디든 정의되면 된다.

- access.log 파일의 위치이다.

상대주소로 명시할 수도 있고

절대주소를 쓸 수도 있다.

아니면 아예 쓰지 않도록 할 수도 있다.

 

2) location - 이거 중요하다

 

- server 블록에 정의되는 마지막 녀석

- nginx 웹서버가 request에 대하여 서버내 자원으로 어떻게 response 할지를 설정하는 것

- server_name domain name 에 대하여 어떻게 처리할지를 설정한 것이라면

- location은 도메인 뒤에 붙는 특정 폴더, 특정 파일에 대한 처리를 설정하는 것이다.

 

몇몇 예시를 보자

location 
location 
location 
location 
location 
'images/ { } 
'blog/ { } 
'planet/ { } 
/planet/blog/ { }

 

말 그대로 도메인  뒤에 들어오는 대로 처리해주면 된다.

예를 들여 누군가가 http://example.com 으로 요구를 한다고 할때 각각은 다음과 대칭된다

- http://example.com

- http://example.com/images

- http://example.com/blogs

- http://example.com/planet

- http://example.com/planet/blog

이렇게 쳐서 들어오는 request 에 대한 처리가 { } 안에 명시되는 것이다.

* /planet/ /planet/about/ 등과 같은 것들도 처리해준다

location 
location 
IndexPage\. php$ { }

 

~ (tilde) 로 시작하는 경우는

- 정규식 매치를 해준다 (regular expression). 정확히는 PCRE - Perl Compatible Regular Expressions

- 대소문자를 가린다 (case sensitive)

1) 따라서 첫줄은 IndexPage.php 에 대한 처리를 { } 안에서 해주겠다는 것이고

2) 두번째 줄 /BlogPlanet(/|/index\.php)$

/BlogPlanet/ 또는 /BlogPlanet/index.php { } 안에서 처리해주겠다는 것

location 
location

 

~* (tilde *) 로 시작해주면 대소문자를 무시한다 = case insensitive

1) 은 파일 확장자가 .pl .cgi .perl .prl 인 경우를 모두 처리한다

2) 는 파일 확장자가 .md .mdwn .txt .mkdn 인 경우를 모두 처리한다

location 
location 
/images/lndexpage/ { } 
/b10g/B10gP1anet/ {

 

^~ 로 시작해주면

- 특정한 문자열을 만나기만 하면

- location 에서 더 정확하게 찾으려 말고 여기의 { } 설정대로 하라는 것이다.

(location 간의 우선순위는 나중에 더 보자)

= 는 정확하게 매칭이 되어야 한다는 것을 말한다

- 맨 처음에  = 가 없을때는 * /planet/ /planet/about/ 등과 같은 것들도 처리해준 것을 기억하자

- 예를 들어 http://example.com 만 처리하지, http://example.com/index.html 은 처리해주지 않는다

* 이거하면 request 처리 속도가 쪼금 빨라질수가 있다.

 

location 우선순위는

1) 정확하게 string 같으면 바로 수행

2) ^~ 에서 명시된 부분이 포함되면 여기서 수행

3) ~ 또는 ~* 정규식과 매칭이 되면 여기서 수행

4) 남은중에서 가장 맞는 녀석으로 수행

- 도메인 아래의 파일과 폴더들은 최소한 하나의 location 설정과 매칭되어야 한다

 

3) Location Root Index

 

location 역시 블록을 가지고 있다.

 

location / { 
root html; 
index index. html index. htm; 
4

 

일단 request가 가장 적합한 location을 만나면

location 블록 (= {} ) 이 지시하는대로 수행한다

 

root

- 이 경우는 html 폴더를 의미하며 /etc/nginx/html/ 이다.

- 만약 http://example.com/blog/includes/style.css 라고 request 가 왔는데 여기서 처리한다면

- blog라는 폴더가 없으므로

- /etc/nginx/html/blog/includes/style.css 를 찾아서 return 해준다

* 여기선 상대주소를 줬지만 절대주소를 줄수도 있다. = /etc/nginx/html/

index

- root 가 폴더를 의미한다면

- index는 그 폴더에서 매칭이 되는 파일을 실행한다

- 여기서는 우선 index.html 을 찾고, 없으면 index.htm 을 실행한다

* 만약 둘다 없다면? 404 에러 메시지!

/srv/www/example.com/public html; 
index. html index. htm; 
4 
location / 
index 
location 
Off ; 
gzlp 
include /etc/nginx/fastcgi_params ; 
fastcgi_pass 
unix: /var/run/fcgiurap. socket; 
fastcgi_index index.pl; 
fastcgi_param SCRIPT _ FILENAME /srv/www/wwe/.example.com/public html$fastcgi_script_name;

 

1) 첫번째 location은 어렵지 않을 것이다.

- 그냥 root의 위치를 알려주고

- 거기에서 실행될 파일명을 알려준다

 

2) 두번째는 확장자가 .pl인 경우 여기를 이용하라는 것이다. 

 

 

개인적 마무리

 

좋은 링크였는데 upstream 에 대한 설명이 없어서 아쉬웠음

upstream 은 링크 참고: http://nginx.org/en/docs/http/ngx_http_upstream_module.html

 

하나만 보자면

upst ream backend { 
server backend I example.com 
server backend2. example.com:a:lÆ; 
server unix:/tmp/backend3; 
server backupl .example.com :BC80 
server backup2.example.com :BC80 
Example Configuration 
backup ; 
backup ; 
proxy-pass http: 
t:nckald ; 
Dynamically configurable group with 
subscription: 
upst ream dyrnmic { 
zone upstream_ ynamic 64k; 
periodic health checks 
is available 
as 
part of our commercial 
server 
server 
server 
server 
server 
server 
server 
backend I example.com 
backend2. example.com:a:lffl fai I _ t i 
læ.O.2.l 
backend3. example.com 
backend4. example.com 
backupl .example.com :BC80 
backup? examp le com :BC80 
max _ fai Is=3; 
service#lttp resolve; 
backup; 
backup; 
O 
proxy-pass 
heal th_check ; 
nam.c;

 

1) 1번의 location 규칙에 맞게 들어오는 녀석은

- 일단 proxy_pass 로 특정 서버(?)로 보낸다

- 내부 서버로 보낼 수도 있고 (=예를 들면, gunicorn 으로 생성한 내부 서버)

- 아예 외부의 서버로 보낼 수도 있다.

 

여기서는 nginx 내부의 backend, dynamic 이라는

추상적 upstream 서버로 보낸 것이다.

 

2) upstream server로 흘러들어온 request 들은

- weight 에 따라 로드발란싱되며 분배되기도 하고

- 암튼 다양한 옵션에 따라 처리된다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Microsoft OneNote 2016에서 작성